import Bluetooth from "../../utils/bluetooth"

// pages/updateBleName/index.js
Page({

    /**
     * 页面的初始数据
     */
    data: {
        testFunctionList: [{   // 功能测试列表数据
            testFunction: '单击设备按钮进入普通模式',
            state: false
        }, {
            testFunction: '普通模式下设备前倾动作',
            state: false
        }, {
            testFunction: '普通模式下设备左倾动作',
            state: false
        }, {
            testFunction: '普通模式下设备右倾动作',
            state: false
        }, {
            testFunction: '双击设备按钮进入运动模式',
            state: false
        }, {
            testFunction: '运动模式下设备前倾动作',
            state: false
        }, {
            testFunction: '运动模式下设备左倾动作',
            state: false
        }, {
            testFunction: '运动模式下设备右倾动作',
            state: false
        }, {
            testFunction: '长时间(2s~3s)按设备,关闭设备',
            state: false
        }],
        nameValue: '',    // 用户准备设置的蓝牙名称
        disabled: true,    // 初始化时的input和按钮的禁用状态
    },

    /**
     * 生命周期函数--监听页面加载
     */
    onLoad(options) {
        const {
            deviceId
        } = options
        console.log('设备Id', deviceId)
        if (deviceId) {
            this.connectDeviceBle(deviceId)
        }
    },
    // 与设备进行连接
    connectDeviceBle(deviceId) {
        let _loadingCount = 1,
            title = '连接中...'
        wx.showLoading({
            title,
        })
        Bluetooth.createBLEConnection(deviceId).then((res) => {
            console.warn('连接成功')
            if (_loadingCount == 1) {
                _loadingCount = 0
                wx.hideLoading({}).then((res) => {
                    this.getDeviceServices(deviceId)
                })
            }
        }).catch((err) => {
            console.log('连接设备失败--原因', err)
        })
    },

    // 获取设备服务值(主服务) services
    getDeviceServices(deviceId) {
        let _loadingCount = 1,
            title = '获取服务中...',
            serviceId = ''
        wx.showLoading({
            title,
        })
        Bluetooth.getBLEDeviceServices(deviceId).then((res) => {
            console.warn('设备所有服务值', res.services)
            res.services.forEach((item) => {
                if (item.uuid.includes('FF00') && item.isPrimary) { // FF00--矫姿设备主服务
                    serviceId = item.uuid
                    if (_loadingCount == 1) {
                        _loadingCount = 0
                        wx.hideLoading({}).then((res) => {
                            this.getDeviceCharacteristics(deviceId, serviceId)
                        })
                    }
                }
            })
        }).catch((err) => {
            console.log('获取设备服务失败--原因', err)
        })
    },

    // 获取设备所有特征值--characteristics(读/写特征值)
    getDeviceCharacteristics(deviceId, serviceId) {
        let _loadingCount = 1,
            title = '读取特征值...',
            characteristicId = ''
        wx.showLoading({
            title,
        })
        Bluetooth.getBLEDeviceCharacteristics(deviceId, serviceId).then((res) => {
            console.log('获取设备特征值成功')
            console.warn('获取到设备主服务下的所有特征值', res.characteristics)
            res.characteristics.forEach((item) => {
                characteristicId = item.uuid
                if (_loadingCount == 1) {
                    _loadingCount = 0
                    wx.hideLoading({}).then((res) => {
                        console.log('设备连接成功')
                        this.setData({
                            showConnect: true
                        })
                    })
                }
                if (item.properties.notify) { // 读--特征值
                    console.log('读-特征值', characteristicId)
                    this.notifyDeviceCharacteristicValueChange(deviceId, serviceId, characteristicId)
                }
                if (item.properties.write) { // 写--特征值
                    console.log('写-特征值', characteristicId)
                    this.setData({
                        deviceId,
                        serviceId,
                        characteristicId
                    })
                    this.writeBLECharacteristicValue('0901')
                }
            })
        }).catch((err) => {
            console.log('读取设备特征值(读/写)失败--原因', err)
        })
    },

    // 监听设备广播出来的数据变化时触发
    notifyDeviceCharacteristicValueChange(deviceId, serviceId, characteristicId) {
        console.log('进入到监听蓝牙广播数据notify方法里')
        Bluetooth.notifyBLECharacteristicValueChange(deviceId, serviceId, characteristicId).then((res) => {
            wx.onBLECharacteristicValueChange((res) => {    // 监听蓝牙低功耗设备的特征值变化事件
                let value = Bluetooth.ab2hex(res.value)
                // console.log('蓝牙设备广播出来的数据--解析后', value)
                this.dataHandle(value)
            })
        }).catch((err) => {
            console.log('监听到蓝牙广播出来的数据失败--原因', err)
        })
    },

    // 监听蓝牙广播出来的数据处理事件回调
    dataHandle(value) {
        let type = value.slice(4, 6), fx
        let { testFunctionList } = this.data
        if(type === '09') {    // 测试模式下返回数据---长按开机 单击普通模式 双击运动模式 长按关机
            this.testFunctionState = value.slice(6, 8)
            testFunctionList.forEach((item, i) => {
                // if(this.testFunctionState === '03' && i == 0) {   // 长按开机
                //     item.state = true
                // }
                if(this.testFunctionState === '01' && i == 0) {   // 单击普通模式
                    item.state = true
                }
                if(this.testFunctionState === '02' && i == 4) {   // 双击运动模式
                    item.state = true
                }
                if(this.testFunctionState === '04' && i == 8) {   // 长按关机,结束之后向蓝牙设备发送测试结束指令
                    item.state = true
                    this.writeBLECharacteristicValue('0900')
                    wx.showToast({
                      title: '测试完毕!',
                      icon: 'success'
                    }).then((res) => {
                        this.setData({
                            disabled: false
                        })
                    })
                }
            })
        } else if(type === '05') {   // 测试设备方向变化---前倾 左倾 右倾
            console.log('操作类型' + type, '测试功能' + this.testFunctionState)
            fx = value.slice(18, 20)
            testFunctionList.forEach((item, i) => {
                if(this.testFunctionState === '01' && fx === '03' && i == 1) {   // 普通前倾测试
                    item.state = true
                } else if(this.testFunctionState === '02' && fx === '03' && i == 5) {   // 运动前倾测试
                    item.state = true
                } else if(this.testFunctionState === '01' && fx === '02' && i == 2) {   // 普通左倾测试
                    item.state = true
                } else if(this.testFunctionState === '02' && fx === '02' && i == 6) {   // 运动左倾测试
                    item.state = true
                } else if(this.testFunctionState === '01' && fx === '01' && i == 3) {   // 普通右倾测试
                    item.state = true
                } else if(this.testFunctionState === '02' && fx === '01' && i == 7) {   // 运动右倾测试
                    item.state = true
                }
            })
        }
        this.setData({
            testFunctionList
        })
    },

    // input 失去焦点时触发
    inputChange(e) {
        let nameValue = e.detail.value
        console.log('inputValue', nameValue)
        this.setData({
            nameValue
        })
    },

    // 用户点击了确定修改按钮
    determine() {
        let { nameValue } = this.data
        let strToHexString = '08' + Bluetooth.stringToHexCharCode(nameValue)
        console.log('确定', nameValue, strToHexString)
        if(nameValue.length < 4) {
            wx.showToast({
              title: '修改失败,修改名字不能少于4位',
              icon: 'none'
            })
        } else {
            this.writeBLECharacteristicValue(strToHexString)
        }
    },
    // 往设备里写入数据
    writeBLECharacteristicValue(hexStringValue) {   // writeBLECharacteristicValue
        let { deviceId, serviceId, characteristicId } = this.data
        let strValue = `4A5A${hexStringValue}5342`
        console.log('写入设备的十六进制字符串', strValue)
        let value = Bluetooth.hexStringToArrayBuffer(strValue)
        Bluetooth.writeBLECharacteristicValue(deviceId, serviceId, characteristicId, value).then((res) => {
            console.log('写入数据成功', res)
            if(hexStringValue.slice(0, 2) === '08') {
                wx.showToast({
                  title: '修改成功!',
                  icon: 'success'
                }).then((res) => {
                    Bluetooth.closeBluetoothAdapter().then((res) => {
                        wx.navigateBack()
                    }).catch((err) => {
                        console.log('关闭蓝牙模块失败', err)
                    })
                })
            }
        }).catch((err) => {
            console.error('写入数据失败--原因', err)
        })
    },
})